import Constant.constant;
import util.array_is_emptyexception;
import util.posException;

import java.util.Arrays;

public class MyArrayList implements Ilist{
    private int[] elem;
    //用于储存元素

    private int ret;
    //用来计算有效的元素

    public MyArrayList(){
        this.elem=new int[constant.CAPACITY];
        //一共有5个容量
    }

    @Override
    public void add(int data) {
        //1.判断是否为满，满了就扩容
        if(isfull()){
            grow();
        }
        this.elem[ret]=data;
        this.ret++;
    }
    public boolean isfull() {
        return this.ret==elem.length;
    }
    public void grow(){
        this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
    }
    @Override
    //在指定位置中，添加元素。
    public void add(int pos, int data) {
        //1.检查是否为满
        if(isfull()){
            grow();
        }
        String msg=constant.ADD_POS_IS_WRONG+pos;//代码更加高大上
        check_pos_add_is_right(pos,msg);
      if(pos==ret){//其实我第一次想到了，但是脑子抽了，写了个this.ret=elem.length。elem.length是个定值，脑子有抽了一下
          elem[pos]=data;
          this.ret++;
          return;

      }
        for(int i=this.ret-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        elem[pos]=data;//搞忘了这个
        this.ret++;
    }
    public void check_pos_add_is_right(int pos,String msg){
        if(pos<0||pos>ret){
            throw new posException(msg);//包不能叫Exception，叫util把
        }
    }
    @Override
    //检查数组中是否包含一个整数
    public boolean contains(int toFind) {
        for(int i=0;i<ret;i++){
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
    }

    @Override
    //找到数组中元素的下标
    public int indexOf(int toFind) {
        for(int i=0;i<ret;i++){
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }

    @Override
    //获取 pos 位置的元素
    public int get(int pos) {
      //1.数组为满可以，数组为空则没有元素
        check_array_is_empty();
        //2.检查输入的下标是否合法
        String msg=constant.GET_POS_IS_WRONG+pos;
        check_pos_get_is_right(pos,msg);
        return elem[pos];//pos是合法的

    }
    public void check_array_is_empty(){
        if(this.ret==0){
            throw new array_is_emptyexception(constant.ARRAY_IS_EMPTY);
        }
    }
    public void check_pos_get_is_right(int pos,String msg){
        if(pos<0||pos>=ret){
            throw new posException(msg);
        }
    }

    @Override
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        //1.数组为满可以，数组为空就不行
        check_array_is_empty();
        //2.判断输入的pos值是否合法
        String msg=constant.SET_POS_IS_WRONG+pos;
        check_pos_get_is_right(pos,msg);
        elem[pos]=value;

    }

    @Override
    public void remove(int toRemove) {

    }

    @Override
    // 获取顺序表长度
    public int size() {
        return this.ret;

    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {
        for(int i=0;i<ret;i++){
            System.out.print(elem[i]+" ");
        }
        System.out.println();

    }
}
